home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1998 June / SGI Freeware 1998 June.iso / dist / fw_UMINNgopher.idb / usr / freeware / src / gopher_1.12 / gopher / cso.c.z / cso.c
C/C++ Source or Header  |  1997-09-09  |  4KB  |  138 lines

  1. /********************************************************************
  2.  * $Author: drich $
  3.  * $Revision: 1.1 $
  4.  * $Date: 1995/10/03 04:07:59 $
  5.  * $Source: /proj/freeware1.0/gopher1.12/src/gopher/RCS/cso.c,v $
  6.  * $State: Exp $
  7.  *
  8.  * Paul Lindner, University of Minnesota CIS.
  9.  *
  10.  * Copyright 1991, 1992 by the Regents of the University of Minnesota
  11.  * see the file "Copyright" in the distribution for conditions of use.
  12.  *********************************************************************
  13.  * MODULE: cso.c
  14.  * Functions to support CSO qi/ph servers
  15.  *********************************************************************
  16.  * Revision History:
  17.  * $Log: cso.c,v $
  18.  * Revision 1.1  1995/10/03  04:07:59  drich
  19.  * gopher 1.2 check-in
  20.  *
  21.  * Revision 1.4  1993/01/08  19:43:01  lindner
  22.  * dialog box cancels automatically if the user doesn't enter anything.
  23.  *
  24.  * Revision 1.3  1992/12/31  05:53:01  lindner
  25.  * Mods for VMS
  26.  *
  27.  * Revision 1.2  1992/12/28  19:02:58  lindner
  28.  * Changed field selection criteria to be based on "Lookup"
  29.  * not "Indexed".  Removed old dead static variables.
  30.  * Changed the name of the popup box from "Ph Query" to the
  31.  * name of the gopher item.
  32.  *
  33.  * Revision 1.1  1992/12/10  23:32:16  lindner
  34.  * gopher 1.1 release
  35.  *
  36.  *********************************************************************/
  37.  
  38. #include "gopher.h"
  39.  
  40. void do_cso(ZeGopher)
  41.   GopherStruct *ZeGopher;
  42. {
  43.      char inputline[1024], *cp;
  44.      int sockfd, len, numfields=0;
  45.      char *Fields[50];
  46.      char *Responses[50];
  47.      char query[512], tmpquery[256];
  48.      int i;
  49.  
  50.      Draw_Status("Fetching Fields...");
  51.      refresh();
  52.  
  53.      /*** Fetch the indexed fields from the server ***/
  54.      if ((sockfd = GSconnect(ZeGopher)) <0) {
  55.       check_sock(sockfd, GSgetHost(ZeGopher), GSgetPort(ZeGopher));
  56.       return;
  57.      }
  58.  
  59.      writestring(sockfd, "fields\r\n");
  60.      
  61.      while (1) {
  62.       len = readline(sockfd, inputline, 1024);
  63.       twirl();
  64.       if ((len <= 0) || (strncmp(inputline, "200", 3)==0))
  65.            break;
  66.  
  67.       cp = inputline;
  68.       if (strstr(inputline, "Lookup") == NULL)
  69.            continue;
  70.       
  71.       cp = strrchr(inputline,':');
  72.       *cp = '\0';
  73.       cp --;
  74.       cp = strrchr(inputline, ':') + 1;
  75.       
  76.       if (numfields < (LINES-10)) {
  77.            /*** Put name at the top ***/
  78.            
  79.            if (strcmp(cp, "name") == 0 && numfields != 0) {
  80.             Fields[numfields] = Fields[0];
  81.             Fields[0] = strdup(cp);
  82.            }
  83.            else {
  84.             Fields[numfields] = strdup(cp);
  85.            }
  86.            Responses[numfields] = (char *) malloc(sizeof(char)*80);
  87.            *Responses[numfields] = '\0';
  88.            *(Responses[numfields]+1) = '\0';
  89.            numfields++;
  90.       }
  91.      }
  92.      Fields[numfields] = NULL;
  93.      Responses[numfields] = NULL;
  94.  
  95.      writestring(sockfd, "quit\r\n");
  96.      /** Read the stupid bye message **/
  97.      readline(sockfd, inputline, 1024);
  98.      closenet(sockfd);
  99.  
  100.      Draw_Status("...");
  101.  
  102.  
  103.      refresh();
  104.  
  105.      if (CURRequest(CursesScreen, GSgetTitle(ZeGopher), Fields, Responses) < 0)
  106.       return;
  107.      
  108.      strcpy(query, "query ");
  109.  
  110.      for (i=0; i<numfields; i++) {
  111.       if (*Responses[i] != '\0') {
  112.            cp = strrchr(Responses[i], ' ');
  113.            while (cp != NULL) {
  114.             sprintf(tmpquery, "%s=%s ", Fields[i], cp+1);
  115.             strcat(query, tmpquery);
  116.             *cp = '\0';
  117.             cp = strrchr(Responses[i], ' ');
  118.            }
  119.             
  120.            sprintf(tmpquery, "%s=%s ", Fields[i], Responses[i]);
  121.            strcat(query, tmpquery);
  122.       }
  123.      }
  124.      if (strlen(query) > 6)
  125.       GSsetPath(ZeGopher, query);
  126.      else
  127.       return;
  128.  
  129.      Draw_Status("Searching...");
  130.      refresh();
  131.      showfile(ZeGopher, NULL);      /* Receive response as a file, exit */
  132.  
  133.      /*** Free the memory that we just allocated for fields ***/
  134.  
  135.      for (i=0; i<numfields; i++)
  136.       free(Fields[i]);
  137. }
  138.